﻿#include<iostream>
using namespace std;



//class Person 
//{
//public:
//	virtual void BuyTicket() //虚函数 
//	{ cout << "买票-全价" << endl; }
//};
//
//class Student : public Person 
//{
//public:
//	virtual void BuyTicket() //重写基类虚函数
//	{ cout << "买票-打折" << endl; }
//};
//
//void Func(Person* ptr)
//{
//	ptr->BuyTicket();
//}
//
//int main()
//{
//	Person ps;
//	Student st;
//	Func(&ps);
//	Func(&st);
//
//	return 0;
//}




//class Animal
//{
//public:
//	virtual void talk() const //虚函数
//	{}
//};
//
//class Dog : public Animal
//{
//public:
//	virtual void talk() const //重写基类虚函数
//	{
//		std::cout << "汪汪" << std::endl;
//	}
//};
//
//class Cat : public Animal
//{
//public:
//	virtual void talk() const //重写基类虚函数
//	{
//		std::cout << "(>^ω^<)喵" << std::endl;
//	}
//};
//
//void letsHear(const Animal& animal)
//{
//	animal.talk();
//}
//
//int main()
//{
//	Cat cat;
//	Dog dog;
//	letsHear(cat);
//	letsHear(dog);
//	return 0;
//}



//class A
//{
//public:
//	virtual void func(int val = 1) { std::cout << "A->" << val << std::endl; }
//	virtual void test() { func(); }
//};
//
//class B : public A
//{
//public:
//	void func(int val = 0) { std::cout << "B->" << val << std::endl; }
//};
//
//int main(int argc, char* argv[])
//{
//	B* p = new B;
//	p->test();
//	//p->func();
//
//	return 0;
//}


//class Base 
//{
//public:
//    void func() { cout << "Base::func()" << endl; } // 虚函数
//};
//class Derived : public Base {
//public:
//    void func() { cout << "Derived::func()" << endl; } // 重写虚函数
//};
//
//int main() {
//    Derived* ptr = new Derived();
//    ptr->func(); // 调用哪个？
//
//    return 0;
//}


//class Car 
//{
//public:
//	virtual void Dirve()
//	{}
//};
//
//class Benz :public Car 
//{
//public:
//	virtual void Drive() override //帮助检测是否完成重写
//	{ cout << "Benz-舒适" << endl; }
//};
//
//int main()
//{
//	return 0;
//}


//// error C3248: “Car::Drive”: 声明为“final”的函数⽆法被“Benz::Drive”重写
//class Car
//{
//public:
//	virtual void Drive() final 
//	{}
//};
//
//class Benz :public Car
//{
//public:
//	virtual void Drive() 
//	{ cout << "Benz-舒适" << endl; }
//};
//
//int main()
//{
//	return 0;
//}


//class Base
//{
//public:
//	virtual void Func1()
//	{
//		cout << "Func1()" << endl;
//	}
//protected:
//	int _b = 1;
//	char _ch = 'x';
//};
//int main()
//{
//	Base b;
//	cout << sizeof(b) << endl;
//	return 0;
//}
//


//class Person 
//{
//public:
//	virtual void BuyTicket() { cout << "买票-全价" << endl; }
//private:
//	string _name;
//};
//
//class Student : public Person 
//{
//public:
//	virtual void BuyTicket() //重写虚函数BuyTicket
//	{ cout << "买票-打折" << endl; }
//private:
//	string _id;
//};
//
//class Soldier : public Person 
//{
//public:
//	virtual void BuyTicket() //重写虚函数BuyTicket
//	{ cout << "买票-优先" << endl; }
//private:
//	string _codename;
//};
//void Func(Person* ptr)
//{
//	ptr->BuyTicket();
//}
//
//int main()
//{
//	Person ps;
//	Student st;
//	Soldier sr;
//
//	Func(&ps);
//	Func(&st);
//	Func(&sr);
//
//	return 0;
//}


//class Base 
//{
//public:
//    virtual void func1() { cout << "Base::func1" << endl; }
//    virtual void func2() { cout << "Base::func2" << endl; }
//};
//
//class Derived : public Base 
//{
//public:
//
//    void func1() override { cout << "Derived::func1" << endl; } // 重写func1
//    virtual void func3() { cout << "Derived::func3" << endl; } // 新增虚函数func3    
//};
//
//int main()
//{
//    Base b;
//    Derived d;
//
//    Base* ptr = new Derived();
//    ptr->func1();
//
//    return 0;
//}


//class Base 
//{
//public:
//    virtual void func(int x) { /* ... */ }
//};
//
//class Derived : public Base 
//{
//public:
//    // 编译报错：Base中没有“virtual void func(double x)”的虚函数可重写
//    void func(double x) override { /* ... */ }
//};

//
//class Base 
//{
//public:
//    // final标记：该虚函数不能被派生类重写
//    virtual void func() final { /* ... */ }
//};
//
//class Derived : public Base 
//{
//public:
//    // 编译报错：Base::func() 已被final禁止重写
//    void func() override { /* ... */ }
//};



////基类
//class Base
//{
//public:
//    Base() { cout << "Base 构造" << endl; }
//
//    // 非虚析构（错误示范）
//    // ~Base() { cout << "Base 析构" << endl; }
//
//    // 虚析构（正确做法）
//    virtual ~Base() { cout << "Base 析构" << endl; }
//};
//
////派生类
//class Derived : public Base
//{
//private:
//    int* data;   //派生类动态资源
//public:
//    Derived() : data(new int(10)) { cout << "Derived 构造" << endl; }
//    ~Derived() //派生类析构：先释放自身资源，再调用基类析构
//    {
//        delete data;  //释放派生类资源
//        cout << "Derived 析构" << endl;
//    }
//};
//
//int main()
//{
//    Base* ptr = new Derived(); //基类指针指向派生类对象
//    delete ptr;   //销毁对象
//    return 0;
//}


//class Base {
//public:
//    void func() { cout << "Base::func()" << endl; } // 非虚函数
//};
//class Derived : public Base {
//public:
//    void func() { cout << "Derived::func()" << endl; } // 非虚函数（隐藏基类版本）
//};
//
//int main() {
//    Base* ptr = new Derived();
//    ptr->func(); // 调用哪个？
//    return 0;



//class Base {
//public:
//    void func() { cout << "Base::func()" << endl; } // 虚函数
//};
//class Derived : public Base {
//public:
//    void func() { cout << "Derived::func()" << endl; } 
//};
//
//int main() {
//    Base* ptr = new Derived();
//    ptr->func(); // 调用哪个？
//
//
//    return 0;
//}



//// 抽象类：包含纯虚函数draw()
//class Shape {
//public:
//    // 纯虚函数：强制派生类实现绘制逻辑
//    virtual void draw() = 0;
//
//    // 普通虚函数（可选）：可提供默认实现
//    virtual void printInfo() {
//        cout << "This is a shape." << endl;
//    }
//
//    // 析构函数通常声明为虚函数（避免多态销毁时内存泄漏）
//    virtual ~Shape() {}
//};
//
//// 派生类：Circle，必须重写draw()
//class Circle : public Shape {
//private:
//    double radius;
//public:
//    Circle(double r) : radius(r) {}
//
//    // 重写纯虚函数draw()
//    void draw() override {
//        cout << "绘制一个半径为" << radius << "的圆" << endl;
//    }
//
//    // 重写普通虚函数（可选）
//    void printInfo() override {
//        cout << "这是一个圆，半径：" << radius << endl;
//    }
//};
//
//// 派生类：Rectangle，必须重写draw()
//class Rectangle : public Shape {
//private:
//    double width, height;
//public:
//    Rectangle(double w, double h) : width(w), height(h) {}
//
//    void draw() override {
//        cout << "绘制一个宽" << width << "、高" << height << "的矩形" << endl;
//    }
//};
//
//int main() {
//    // 错误：抽象类不能实例化
//    // Shape shape; 
//
//    // 正确：通过派生类实例化
//    Shape* shapes[2] = {
//        new Circle(5.0),
//        new Rectangle(3.0, 4.0)
//    };
//
//    // 多态调用：根据动态类型执行对应派生类的draw()
//    for (int i = 0; i < 2; i++) {
//        shapes[i]->draw();
//        shapes[i]->printInfo();
//        delete shapes[i];
//    }
//
//    return 0;
//}



